Scotty Technologies Inc. (“Scotty”) adalah sebuah perusahaan start-up teknologi yang didirikan pada tahun 2017 di Istanbul, Turkey. Salah satu layanan utama dari Scotty adalah motorcycle ride-sharing atau yang akrab kita ketahui Ojek Online. Menurut informasi yang dilansir dari markets.businessinsider.com, Scotty berencana untuk menjadi super-app pertama di Turkey dengan tekonologi dan model bisnis yang distruptif, serta berencana untuk melanjutkan pertumbuhan yang menjanjikan dan mencapai profitabilitas dalam waktu dekat. Berbicara mengenai pertumbuhan, tentu saja tidak luput dari demand. Oleh karena itu, projek ini ditujukan untuk membuat model analisa dan memprediksi demand transaksi per-jam pada layanan motorcycle ride-sharing di Scotty. Dalam proses pembuatan model ini, kita menggunakan data transaksi Scotty dari 2017-10-01 sampai 2017-12-02.
5 Top Line Data
5 Bottom Line Data
| Variable | Description |
|---|---|
| id | Transaction id |
| trip_id | Trip id |
| driver_id | Driver id |
| rider_id | Rider id |
| start_time | Transaction Time |
| src_lat | Request source latitude |
| src_lon | Request source longitude |
| src_area | Request source area |
| src_sub_area | Request source sub-area |
| dest_lat | Requested destination latitude |
| dest_lon | Requested destination longitude |
| dest_area | Requested destination area |
| dest_sub_area | Requested destination sub-area |
| distance | Trip distance (in KM) |
| status | Trip status (all status considered as a demand) |
| confirmed_time_sec | Time different from request to confirmed (in seconds) |
Missing Value Jika dilihat terdapat missing value pada variabel trip_id dan driver_id, namun tidak menjadi masalah karena pada case ini kita butuh data waktu dan demand.
#> id trip_id driver_id rider_id
#> 0 4676 4676 0
#> start_time src_lat src_lon src_area
#> 0 0 0 0
#> src_sub_area dest_lat dest_lon dest_area
#> 0 0 0 0
#> dest_sub_area distance status confirmed_time_sec
#> 0 0 0 0
Duplicate Value Dataset ini tidak memiliki data transaksi yang duplikat, sehingga bisa kita lanjutkan ke tahap pre-processing.
data.frame(jumlah.observasi.awal=length(scotty_ts$id),
jumlah.observasi.unik=length(unique(scotty_ts$id)))#> Observations: 90,113
#> Variables: 16
#> $ id <fct> 59d005e1ffcfa261708ce9cd, 59d0066affcfa261708ceb...
#> $ trip_id <fct> 59d005e9cb564761a8fe5d3e, NA, 59d006c131e39c6189...
#> $ driver_id <fct> 59a892c5568be44b2734f276, NA, 599dc0dfa5b4fd5471...
#> $ rider_id <fct> 59ad2d6efba75a581666b506, 59cd704bcf482f6ce2fadf...
#> $ start_time <fct> 2017-10-01T00:00:17Z, 2017-10-01T00:02:34Z, 2017...
#> $ src_lat <dbl> 41.07047, 41.07487, 41.04995, 41.05287, 41.06760...
#> $ src_lon <dbl> 29.01945, 28.99528, 29.03107, 28.99522, 28.98827...
#> $ src_area <fct> sxk9, sxk9, sxk9, sxk9, sxk9, sxk9, sxk9, sxk9, ...
#> $ src_sub_area <fct> sxk9s, sxk9e, sxk9s, sxk9e, sxk9e, sxk9s, sxk9s,...
#> $ dest_lat <dbl> 41.11716, 41.08351, 41.04495, 41.08140, 41.02125...
#> $ dest_lon <dbl> 29.03650, 29.00228, 28.98192, 28.98197, 29.11316...
#> $ dest_area <fct> sxk9, sxk9, sxk9, sxk9, sxk9, sxk9, sxk9, sxk9, ...
#> $ dest_sub_area <fct> sxk9u, sxk9e, sxk9e, sxk9e, sxk9q, sxk9e, sxk9e,...
#> $ distance <dbl> 5.379250, 1.126098, 4.169492, 3.358296, 11.69357...
#> $ status <fct> confirmed, nodrivers, confirmed, confirmed, nodr...
#> $ confirmed_time_sec <int> 8, 0, 32, 65, 0, 27, 32, 30, 0, 24, 9, 0, 118, 1...
Dataset yang dimiliki terdiri dari 90.133 observasi dan 16 variabel. Jika dilihat dari struktur datanya, beberapa variabel memiliki tipe data yang belum sesuai. Namun, karena projek ini bertujuan untuk melakukan time-series forecasting terhadap demand per-jam pada layanan motorcycle ride-sharing di Scotty, maka data yang kita perlukan adalah waktu transaksi per-jam dan demand pada setiap src_sub_area. Maka dari Berikut prosesnya:
Dalam melakukan analisa dan prediksi time series maka seluruh data waktu harus lengkap secara sekuensial. Jam opearasional Scotty yaitu 24jam/hari, sehingga kita harus memastikan seluruh data jam sudah lengkap secara sekuensial dari rentang tanggal minimum hingga tanggal maximum.
scotty_ts <- scotty_ts %>%
group_by(src_sub_area) %>%
# PAD tanggal sekuensial
padr::pad(start_val = min(scotty_ts$datetime), end_val = max(scotty_ts$datetime)) %>%
ungroup() %>%
distinct() %>%
mutate(
# replace NA Value menjadi 0
demand = ifelse(is.na(demand),0,demand)
)Berikut ini visualisasi dataset denagan data waktu yang lengkap dan sekuensial. Titik/Poin berwarna merah, hijau dan biru menandakan data pada jam tersebut tidak ada dan mari kita asumsikan bahwa pada jam tersebut memang tidak terdapat transaksi, sehingga jumlah demand = 0.
scotty_demand <- scotty_ts %>%
mutate(
weekdays = weekdays(datetime),
popup = glue(
"Category: {src_sub_area}
Transaction Time: {datetime}
Day: {weekdays}
Demand: {demand}"
))
plot_scotty_demand <- ggplot(scotty_demand,aes(x=datetime, y=demand),show.legend = FALSE)+
#geom_point()+
geom_line(show.legend = FALSE,size=0.3)+
geom_point(aes(text=popup),size=0.05)+
geom_point(data = scotty_demand %>% filter(demand==0),
aes(x=datetime, y=demand, color=src_sub_area, text=popup),size=1, show.legend = FALSE)+
labs(
x = NULL,
y = NULL,
title = "Demand by Sub Area"
) +
scale_x_datetime(date_breaks = "7 day", labels = date_format("%b %d"))+
facet_wrap(~ src_sub_area, scale = "free", ncol = 1)+
theme(
legend.position = "none",
plot.title = element_text(hjust = 0.5),
panel.spacing = unit(1, "lines"))+
tidyquant::theme_tq()
ggplotly(p = plot_scotty_demand, tooltip="text") %>%
layout(showlegend=FALSE)#> src_sub_area datetime demand
#> sxk97:1512 Min. :2017-10-01 00:00:00 Min. : 0.00
#> sxk9e:1512 1st Qu.:2017-10-16 17:45:00 1st Qu.: 5.00
#> sxk9s:1512 Median :2017-11-01 11:30:00 Median : 15.00
#> Mean :2017-11-01 11:30:00 Mean : 19.87
#> 3rd Qu.:2017-11-17 05:15:00 3rd Qu.: 27.00
#> Max. :2017-12-02 23:00:00 Max. :217.00
Informasi di atas merupakan summary keseluruhan data yang kita miliki. Dapat diketahui bahwa dataset ini merupakan data transaksi dari 3 sub area yaitu sxk97, sxk9e dan sxk9s yang terjadi dari 2017-10-01 00:00 sampai 2017-12-02 23:00 dengan jumlah minimum 0 demand dan jumlah maximum 217 demand. Demand 0 dapat diasumsikan bahwa pada waktu tertentu memang tidak terdapat transaksi.